package com.zxx.coolweather._wuguan;

import android.util.Log;

import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * IHttpRequest的实现类 （Json版Http请求）
 *
 * 在重写的execute方法中，使用原生的HttpURLConnection执行网络请求，请求成功后，回调IHttpListener的onSuccess方法。
 *
 * 如果想要传送其他数据（图片，文件等），同样实现IHttpRequest该接口即可，所以这个框架的扩展性十分良好。
 *
 * @author zxx on 2022/1/10
 */
public class JsonHttpRequest implements IHttpRequest {

    private String url;
    private String method;
    private byte[] requestData;
    private IHttpListener httpListener;
    private HttpURLConnection urlConnection;

    @Override
    public void setUrl(String url) {
        this.url = url;
    }

    @Override
    public void setMethod(String method) {
        this.method = method;
    }

    @Override
    public void setRequestData(byte[] requestData) {
        this.requestData = requestData;
    }

    //原生的网络操作在这里实现
    @Override
    public void execute() {
        httpUrlconnPost();
    }

    private void httpUrlconnPost() {
        URL url;
        try {
            url = new URL(this.url);

            //打开http连接
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setConnectTimeout(6000);      //设置连接超时时间
            urlConnection.setReadTimeout(3000);         //响应的超时时间
            urlConnection.setDoInput(true);             //设置这个连接是否可以写入数据

            urlConnection.setRequestMethod(method);
            urlConnection.setRequestProperty("Content-Type", "application/json;charset=UTF-8");

            Log.e("Tag 33-->", method);
            if ("POST".equals(method)) {
                urlConnection.setUseCaches(false);          //不适用缓存
                urlConnection.setDoOutput(true);            //设置这个连接是否可以输出数据

                //设置为true，则系统自动处理跳转，但是对于有多次跳转的情况，就只能处理第一次。
                urlConnection.setInstanceFollowRedirects(true); //是否连接遵循重定向
                urlConnection.connect();    //可以不用，在getInputStream里已经有了

                //请求体，GET没有
                //使用字节流发送数据
                OutputStream out = urlConnection.getOutputStream();
                BufferedOutputStream bos = new BufferedOutputStream(out);
                if (requestData != null) {
                    //把字节数组的数据写入缓存区
                    bos.write(requestData);
                }

                //刷新缓冲区，发送数据
                bos.flush();
                out.close();
                bos.close();
            }

            //获得服务器响应
            if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                InputStream in = urlConnection.getInputStream();
                //回调监听器方法
                httpListener.onSuccess(in);
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
        }
    }

    @Override
    public void setHttpCallBack(IHttpListener httpListener) {
        this.httpListener = httpListener;
    }

}
